package util;

import java.sql.*;

/*
 *数据库操作工具类
 */
public class JDBCUtil {
    /*
     * 1、加载驱动（其实就是代码）
     * 2、初始化连接
     * 3、获取数据库连接句柄(其实就是一个对象)，预校验sql语句，防止sql注入
     * 4、获取结果集，处理数据，返回数据
     * 5、关闭数据库连接，释放资源
     */

    //1、使用静态语句块加载驱动，提高系统效率
    static{
        try {
            //如果mysql是8.x的则使用这个驱动路径
            //Class.forName("com.mysql.cj.jdbc.Driver");
            //如果mysql是5.x的则使用这个驱动路径
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //2、初始化连接
    public static Connection getConnection(){
        Connection connection = null;//声明Connection变量
        try {
            //给connection变量赋值
            connection = DriverManager.getConnection("jdbc:mysql:///sanqiansql?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8","root","shaozhaoming");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //3、获取数据库连接句柄(其实就是一个对象)，预校验sql语句，防止sql注入（preparedstatement）
    public static PreparedStatement getPstmt(Connection connection, String sql){
        PreparedStatement pstmt = null;//声明PreparedStatment变量
        try {
            pstmt = connection.prepareStatement(sql);//给PreparedStatment变量赋值
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pstmt;
    }

    //4、获取结果集，处理数据，返回数据
    public static ResultSet getRs(PreparedStatement pstmt){
        ResultSet rs = null;//声明ResultSet变量
        try {
            rs = pstmt.executeQuery();//给ResultSet变量赋值
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  rs;
    }

    //新增操数据的方法
    public static int modify(PreparedStatement pstmt){
        int result = 0;//声明一个执行结果变量
        try {
            //给执行结果变量赋值
            result = pstmt.executeUpdate();//执行操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    //5、关闭数据库连接，释放资源(倒序的关闭对象)
    public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(pstmt != null){
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
